﻿using System.Data;
using System.Data.Common;
using System.Data.SQLite;

namespace Dao.Base
{
    public class SqliteHelper
    {
        private SQLiteConnection _con ;
        private DbTransaction _tran;

        public SqliteHelper()
        {
            _con = GetSQLiteConnection();
            _con.Open();
        }

        ~SqliteHelper()
        {
            _con.Close();
        }
        /// <summary>
        /// 获得连接对象
        /// </summary>
        /// <returns></returns>
        private static SQLiteConnection GetSQLiteConnection()
        {
           // return new SQLiteConnection(@"Data Source=C:\Program Files (x86)\SeaJoan\BusinessAssistance\Bin\DB\myDb.db");
            return new SQLiteConnection(@"Data Source= E:\MyProject\SanGuoZhi\SanGuo\SanGuo\bin\x86\Debug\Db\194_QXGJ.s3db");
        }
        private void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Parameters.Clear();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 30;
            if (p != null)
            {
                foreach (object parm in p)
                    cmd.Parameters.AddWithValue(string.Empty, parm);
                //for (int i = 0; i < p.Length; i++)
                //    cmd.Parameters[i].Value = p[i];
            }
        }
        /// <summary>
        /// 开始事务
        /// </summary>
        public void BeginTransaction()
        {
            _tran=_con.BeginTransaction() ;
        }

        public void CommitTransaction()
        {
           _tran.Commit();
        }

        public void RollbackTransaction()
        {
            _tran.Rollback();
        }

        public void CloseConnection()
        {
            _con.Close();
        }
        public DataSet ExecuteDataset(string cmdText, params object[] p)
        {
            DataSet ds = new DataSet();
            SQLiteCommand command = new SQLiteCommand();

            PrepareCommand(command, _con, cmdText, p);
            SQLiteDataAdapter da = new SQLiteDataAdapter(command);
            da.Fill(ds);

            return ds;
        }
        public DataRow ExecuteDataRow(string cmdText, params object[] p)
        {
            DataSet ds = ExecuteDataset(cmdText, p);
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                return ds.Tables[0].Rows[0];
            return null;
        }
        /// <summary>
        /// 返回受影响的行数
        /// </summary>
        /// <param name="cmdText">a</param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string cmdText, params object[] p)
        {
            SQLiteCommand command = new SQLiteCommand();

            PrepareCommand(command, _con, cmdText, p);
            return command.ExecuteNonQuery();

        }
        /// <summary>
        /// 返回受影响的行数
        /// </summary>
        /// <param name="cmdText">a</param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public int Tran_ExecuteNonQuery(SQLiteConnection con, string cmdText, params object[] p)
        {
            SQLiteCommand command = new SQLiteCommand();
            PrepareCommand(command, con, cmdText, p);
            return command.ExecuteNonQuery();

        }
        /// <summary>
        /// 返回SqlDataReader对象
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public SQLiteDataReader ExecuteReader(string cmdText, params object[] p)
        {
            SQLiteCommand command = new SQLiteCommand();
            PrepareCommand(command, _con, cmdText, p);
            SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            return reader;
        }
        /// <summary>
        /// 返回结果集中的第一行第一列，忽略其他行或列
        /// </summary>
        /// <param name="cmdText"></param>
        /// <param name="commandParameters">传入的参数</param>
        /// <returns></returns>
        public object ExecuteScalar(string cmdText, params object[] p)
        {
            SQLiteCommand cmd = new SQLiteCommand();

            PrepareCommand(cmd, _con, cmdText, p);
            return cmd.ExecuteScalar();

        }
        /// <summary>
        /// 分页
        /// </summary>
        /// <param name="recordCount"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="cmdText"></param>
        /// <param name="countText"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        public DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, params object[] p)
        {
            if (recordCount < 0)
                recordCount = int.Parse(ExecuteScalar(countText, p).ToString());
            DataSet ds = new DataSet();
            SQLiteCommand command = new SQLiteCommand();

            PrepareCommand(command, _con, cmdText, p);
            SQLiteDataAdapter da = new SQLiteDataAdapter(command);
            da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");

            return ds;
        }
    }
}